﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _05_task的返回值
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Task<返回值的类型>
            Task<int> task = new Task<int>((s) =>
            {
                return int.Parse(s.ToString());
            }, "123");
            task.Start();

            // 通过result 获取task的结果 
            MessageBox.Show(task.Result.ToString());
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Task<int> task = Task.Run(() =>
            {
                Thread.Sleep(3000);
                return 123;
            });

            // task 是一个异步任务 但是当我们尝试获取数据时 这个异步任务就变成了同步任务 
            // 因为必须在 异步任务执行完成之后才能获取到 异步任务返回的结果 因此当我们尝试获取一个异步任务的结果时 异步任务就变成了同步任务 
            //MessageBox.Show(task.Result.ToString());
            //MessageBox.Show("abc");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // wait  等待 
            // wait 是用来实现线程阻塞 或者说 是将异步任务转化为同步 

            // 创建一个做饭的异步任务
            Task task = new Task(() =>
            {
                Console.WriteLine("正在做饭");
                Thread.Sleep(1000);
                Console.WriteLine("饭做好了");
            });
            Task task1 = new Task(() =>
            {
                Console.WriteLine("开始吃饭");
            });
            task.Start();
            task.Wait(); // 等待任务执行完成 类似于线程中的 join 方法
            // 只有上面的任务执行完成 才能开启下面的任务
            task1.Start();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            Task task = new Task(() =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("游戏打完了");
            });
            Task task1 = new Task(() =>
            {
                Thread.Sleep(2000);
                Console.WriteLine("学习的任务执行完成了");
            });

            task.Start();
            task1.Start();
            // 等待多个任务执行完成 
            //Task.WaitAll(task1, task); // 多个任务都执行完成才能执行后续的代码 
            // 任意任务执行完成 后面的任务就可以执行了 
            Task.WaitAny(task1, task);
            Console.WriteLine("所有的任务都执行完成了");
        }

        private void button5_Click(object sender, EventArgs e)
        {
            Task task = new Task(() =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("游戏打完了");
            });
            Task task1 = new Task(() =>
            {
                Thread.Sleep(2000);
                Console.WriteLine("学习的任务执行完成了");
            });

            task.Start();
            task1.Start();

            TaskFactory taskFactory = new TaskFactory();
            // taskFactory.ContinueWhenAll(); 的那个所有的执行完成之后做什么事
            // ContinueWhenAll 不会阻塞线程
            //taskFactory.ContinueWhenAll(new Task[] { task, task1 }, (t) =>
            //{
            //    // t 是一个 Task[] 包含所有执行完成的task 对象
            //    Console.WriteLine("所有任务都执行完成了");
            //});
            // ContinueWhenAny 不会阻塞线程
            taskFactory.ContinueWhenAny(new Task[] { task, task1 }, (t) =>
            {
                // t 是一个 Task[] 包含所有执行完成的task 对象
                Console.WriteLine("某一个任务执行完成了");
            });
            Console.WriteLine("我是ContinueWhenAll后面的代码，我会立即执行");

        }
    }
}
